/******************************************************************************* 
  Copyright (C), 1988-2020, zeno Tech. Co., Ltd.
  Description:  ADEC模块内部头文件
  Function List:
            
*******************************************************************************/
              
#ifndef AUDIO_FAAC_H
#define AUDIO_FAAC_H

/*=============================================================================
                                 Includes                                  
==============================================================================*/
#include "aacPriv.h"
/*=============================================================================
                               Macro Definition
==============================================================================*/

/*=============================================================================
                        Local Structures and Typedef 
==============================================================================*/
#define AAC_RINGBUF_SIZE (64*1024)
typedef struct
{
    unsigned int sampleRate;        /* 采样率 */
    unsigned int channels;          /* 声道数 */
    unsigned int bitWidth;          /* 单样本位数 */
    unsigned int outputFormat;      /* AAC输出格式 (0 = Raw; 1 = ADTS) */
}AAC_audioCfg_t;

typedef struct {
    char *pBaseAddr;    /* ringbuf地址 */
    int totalSize;      /* ringbuf总长度 */
    int wrOffset;       /* end偏移地址 */
    int rdOffset;       /* start偏移地址 */
    int dataLen;        /* 音频数据缓存长度 */
    pthread_mutex_t ringMutex; /* ringbuf多线程操作线程锁 */
}AAC_RINGBUF_t;

typedef struct
{
    char *pPcmBuffer;               /* pcm音频输入数据 */
    unsigned long inputSamples;     /* 输入样本数 */
    unsigned long maxOutputBytes;   /* 输出所需最大空间 */
    unsigned long maxInputBytes;    /* 输入最大字节 */
    faacEncHandle hEncoder;         /* aac编码句柄 */
    AAC_RINGBUF_t ringBuf;          /* aac数据缓存结构体 */
    void *hRingBuf;                 /* ring buf handle */
    void *hQueue;                   /* queue handle */
    pthread_t aencPtid;				/* aac编码线程 */
    int aacStart;					/* 编码线程是否使能 */
    AAC_audioCfg_t aacCfg;          /* 编码配置*/
}AAC_ctl_t;

typedef struct
{
    NeAACDecHandle hDecoder;        /* aac解码句柄 */
    unsigned int isInitAad;         /* 是否初始化AAC解码 */
    unsigned int bitWidth;          /* 单样本位数 */
    AAC_RINGBUF_t ringBuf;          /* aac数据缓存结构体 */
    AAC_audioCfg_t aadCfg;          /* 编码配置*/
    unsigned long maxOutputBytes;   /* 输出最大字节 */
}AAD_ctl_t;

typedef struct
{
    unsigned int tvSec;
    unsigned int tvUsec;
    unsigned int sequence;
    unsigned int dataSize;
    unsigned char *pData;
}AAC_aencStream_t;

/*=============================================================================
                             extern  Variables                                  
==============================================================================*/

/*=============================================================================
                             Function Definition                                  
==============================================================================*/

/*******************************************************************************
    Function:     AAC_EncCreat
    Description:  创建AAC音频编码资源
    Input:        - pAacCfg: 音频信息配置
    Output:       无
    Return:       !NULL: 操作成功
                  NULL: 操作失败
    Others:       无
*******************************************************************************/
void *AAC_EncCreat(AAC_audioCfg_t *pAacCfg);

/*******************************************************************************
    Function:     AAC_EncDestroy
    Description:  销毁AAC音频编码资源
    Input:        - hAac: AAC句柄
    Output:       无
    Return:       0: 操作成功
                  -1: 操作失败
    Others:       无
*******************************************************************************/
int AAC_EncDestroy(void *hAac);

/*******************************************************************************
    Function:     AAC_EncSendFrame
    Description:  发送音频数据至AAC编码线程
    Input:        - hAac: AAC句柄
                  - pInData: 输入数据指针
                  - dataLen: 输入数据长度
    Output:       无
    Return:       0: 操作成功
                  -1: 操作失败
    Others:       无
*******************************************************************************/
int AAC_EncSendFrame(void *hAac, char *pInData, int dataLen);

/*******************************************************************************
    Function:     AAC_EncGetStream
    Description:  获取AAC音频编码数据
    Input:        - hAac: AAC句柄
    Output:       - pAencStream:编码信息结构体指针
    Return:       0: 操作成功
                  -1: 操作失败
    Others:       无
*******************************************************************************/
int AAC_EncGetStream(void *hAac, AAC_aencStream_t *pAencStream);

/*******************************************************************************
    Function:     AAC_EncReleaseStream
    Description:  释放AAC音频编码数据
    Input:        - hAac: AAC句柄
                  - pAencStream:编码信息结构体指针
    Output:       无
    Return:       0: 操作成功
                  -1: 操作失败
    Others:       无
*******************************************************************************/
int AAC_EncReleaseStream(void *hAac, AAC_aencStream_t *pAencStream);

/*******************************************************************************
    Function:     AAC_DecCreat
    Description:  创建AAC音频解码资源
    Input:        无
    Output:       无
    Return:       !NULL: 操作成功
                  NULL: 操作失败
    Others:       无
*******************************************************************************/
void *AAC_DecCreat();

/*******************************************************************************
    Function:     AAC_DecSendFrame
    Description:  发送音频数据至AAC解码
    Input:        - hAad: 解码句柄
                  - pInBuf: 输入音频数据缓存
                  - inBufLen: 输入音频数据长度
    Output:       无
    Return:       >0: 操作成功
                  -1: 操作失败
    Others:       无
*******************************************************************************/
int AAC_DecSendFrame(void *hAad, char *pInBuf, int inBufLen);

/*******************************************************************************
    Function:     AAC_DecGetStream
    Description:  获取AAC解码数据
    Input:        - hAad: 解码句柄
                  - inBufLen: 输出音频数据长度
    Output:       - pData: 输出音频数据缓存
    Return:       >0: 操作成功
                  -1: 操作失败
    Others:       无
*******************************************************************************/
int AAC_DecGetStream(void *hAad, char *pData, int dataLen);

/*******************************************************************************
    Function:     AAC_DecDestroy
    Description:  销毁AAC音频解码资源
    Input:        - hAad: 解码句柄
    Output:       无
    Return:       0: 操作成功
                  -1: 操作失败
    Others:       无
*******************************************************************************/
int AAC_DecDestroy(void *hAad);

#endif  /* AUDIO_FAAC_H */

